package resource

import (
	"database/sql"
	"fmt"
	"mallgo/config"
	"mallgo/internal/common/response"
	"mallgo/internal/resources/sql/api/domain/request"
	logger2 "mallgo/logger"
)

var logger = logger2.GetLogger()

func Query(request *request.SqlRequest) *response.ResponseObject {

	cfg := config.LoadConfig("config/config.yaml")

	//"user:password@tcp(127.0.0.1:3306)/dbname"
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
		cfg.Database.Username,
		cfg.Database.Password,
		cfg.Database.Host,
		cfg.Database.Port,
		cfg.Database.DBName,
		cfg.Database.Charset,
	)

	// 连接 MySQL 数据库
	db, err := sql.Open("mysql", dsn)
	if err != nil {
		logger.Info(err)
		return response.Error(501, "查询失败")
	}
	defer db.Close()

	// 查询数据
	rows, err := db.Query(request.Sql)
	if err != nil {
		logger.Info(err)
		return response.Error(502, "查询失败")
	}
	defer rows.Close()

	// 用切片接收所有行数据
	var results []map[string]interface{} // 存储每行数据的切片

	for rows.Next() {
		row := make(map[string]interface{}) // 创建 map 来存储当前行的数据

		// 获取列名和列值
		columns, err := rows.Columns()
		if err != nil {
			logger.Info(err)
			return response.Error(503, "查询失败")
		}

		// 创建一个切片来存放每列的值
		values := make([]interface{}, len(columns))
		for i := range values {
			values[i] = &values[i]
		}

		// 扫描行数据
		if err := rows.Scan(values...); err != nil {
			logger.Info(err)
			return response.Error(504, "查询失败")
		}

		// 把列值填充到 map 中
		for i, column := range columns {
			row[column] = values[i]
		}

		// 将当前行的 map 添加到切片中
		results = append(results, row)
	}

	if err := rows.Err(); err != nil {
		logger.Info(err)
		return response.Error(505, "查询失败")
	}
	return response.Success(results)
}
